package ar.com.age.distribuidora.presentacion.controller;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

import ar.com.age.distribuidora.dominio.Marca;
import ar.com.age.distribuidora.dominio.Producto;
import ar.com.age.distribuidora.dominio.Proveedor;
import ar.com.age.distribuidora.dominio.TipoProducto;
import ar.com.age.distribuidora.dominio.UnidadMedida;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;

@ManagedBean
@SessionScoped
public class RegistrarProductoBean {

	private String codigo;
	
	private String nombre;
	
	private String estado;
	
	private TipoProducto tipoProductoSeleccionado;
	
	private Marca marcaSeleccionada;
	
	private UnidadMedida unidadMedidaSeleccionada;
	
	private List<TipoProducto> tiposProductos;

	private List<Marca> marcas;
	
	private List<UnidadMedida> unidadesMedidas;
	
    private DualListModel<Proveedor> proveedores;  
     
    private Producto producto;

    
	public RegistrarProductoBean() {
		
		List<Proveedor> disponibles = ServiceLocator.getProveedorService().buscarTodos();
		List<Proveedor> insertados = new ArrayList<Proveedor>();
				
		this.proveedores = new DualListModel<Proveedor>(disponibles, insertados);
		
		this.tiposProductos = ServiceLocator.getDatosProductoService().buscarTodosTipoProducto();
		this.unidadesMedidas = ServiceLocator.getDatosProductoService().buscarTodosUnidadMedida();
		this.marcas = ServiceLocator.getDatosProductoService().buscarTodosMarca();
	}
	
	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public TipoProducto getTipoProductoSeleccionado() {
		return tipoProductoSeleccionado;
	}

	public void setTipoProductoSeleccionado(TipoProducto tipoProductoSeleccionado) {
		this.tipoProductoSeleccionado = tipoProductoSeleccionado;
	}

	public Marca getMarcaSeleccionada() {
		return marcaSeleccionada;
	}

	public void setMarcaSeleccionada(Marca marcaSeleccionada) {
		this.marcaSeleccionada = marcaSeleccionada;
	}

	public UnidadMedida getUnidadMedidaSeleccionada() {
		return unidadMedidaSeleccionada;
	}

	public void setUnidadMedidaSeleccionada(UnidadMedida unidadMedidaSeleccionada) {
		this.unidadMedidaSeleccionada = unidadMedidaSeleccionada;
	}

	public List<TipoProducto> getTiposProductos() {
		return tiposProductos;
	}

	public void setTiposProductos(List<TipoProducto> tiposProductos) {
		this.tiposProductos = tiposProductos;
	}

	public List<Marca> getMarcas() {
		return marcas;
	}

	public void setMarcas(List<Marca> marcas) {
		this.marcas = marcas;
	}

	public List<UnidadMedida> getUnidadesMedidas() {
		return unidadesMedidas;
	}

	public void setUnidadesMedidas(List<UnidadMedida> unidadesMedidas) {
		this.unidadesMedidas = unidadesMedidas;
	}

	public DualListModel<Proveedor> getProveedores() {
		return proveedores;
	}

	public void setProveedores(DualListModel<Proveedor> proveedores) {
		this.proveedores = proveedores;
	}

	public Producto getProducto() {
		return producto;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}

	public String setearProducto() {
		
		producto = new Producto();
		producto.setCodigo(codigo);
		producto.setEstado(estado);
		producto.setMarca(marcaSeleccionada);
		producto.setNombre(nombre);
		
		producto.setTipoProducto(tipoProductoSeleccionado);
		producto.setUnidadMedida(unidadMedidaSeleccionada);
		
		List<Proveedor> disponibles = ServiceLocator.getProveedorService().buscarTodos();
		this.proveedores.setSource(disponibles);
				
		return "registrarListaProveedores";

	}
	
	public String registrarProducto() {
		
		if (!proveedores.getTarget().isEmpty()) {
			producto.setProveedores(proveedores.getTarget());

			ServiceLocator.getProductoService().crearOEditar(producto);

			this.nombre = null;
			this.codigo = null;
			this.estado = null;
			
			List<Proveedor> disponibles = ServiceLocator.getProveedorService().buscarTodos();
			List<Proveedor> insertados = new ArrayList<Proveedor>();
			
			this.proveedores.setSource(disponibles);
			this.proveedores.setTarget(insertados);
			
			return "/mensajeExitoso";
		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun proveedor.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}
				
	}
	
	public void transferir(TransferEvent event) { 

		StringBuilder builder = new StringBuilder();  
		for(Object item : event.getItems()) {  
			builder.append(((Proveedor) item).getEmpresa()).append("<br />");  
		}  

		FacesMessage msg = new FacesMessage();  
		msg.setSeverity(FacesMessage.SEVERITY_INFO);  
		msg.setSummary("Items Transferido");  
		msg.setDetail(builder.toString());  

		FacesContext.getCurrentInstance().addMessage(null, msg);  
	} 
		
	
	
}
